import type { cacheType } from '../utils'
import { defineStore } from 'pinia'
import {
  ascending,
  constantMenus,
  debounce,
  filterNoPermissionTree,
  filterTree,
  formatFlatteningRoutes,
  getKeyList,
  store
} from '../utils'
import { useMultiTagsStoreHook } from './multiTags'

export const usePermissionStore = defineStore({
  id: 'pure-permission',
  state: () => ({
    // 静态路由生成的菜单
    constantMenus,
    // 整体路由生成的菜单（静态、动态）
    wholeMenus: [],
    // 整体路由（一维数组格式）
    flatteningRoutes: [],
    // 缓存页面keepAlive
    cachePageList: []
  }),
  actions: {
    /** 组装整体路由生成的菜单 */
    handleWholeMenus(routes: any[]) {
      this.wholeMenus = filterNoPermissionTree(filterTree(ascending(this.constantMenus.concat(routes))))
      this.flatteningRoutes = formatFlatteningRoutes(this.constantMenus.concat(routes))
    },
    cacheOperate({ mode, name }: cacheType) {
      const delIndex = this.cachePageList.findIndex((v) => v === name)
      switch (mode) {
        case 'refresh':
          this.cachePageList = this.cachePageList.filter((v) => v !== name)
          break
        case 'add':
          this.cachePageList.push(name)
          break
        case 'delete':
          delIndex !== -1 && this.cachePageList.splice(delIndex, 1)
          break
      }
      /** 监听缓存页面是否存在于标签页，不存在则删除 */
      debounce(() => {
        let cacheLength = this.cachePageList.length
        const nameList = getKeyList(useMultiTagsStoreHook().multiTags, 'name')
        while (cacheLength > 0) {
          nameList.findIndex((v) => v === this.cachePageList[cacheLength - 1]) === -1 &&
            this.cachePageList.splice(this.cachePageList.indexOf(this.cachePageList[cacheLength - 1]), 1)
          cacheLength--
        }
      })()
    },
    /** 清空缓存页面 */
    clearAllCachePage() {
      this.wholeMenus = []
      this.cachePageList = []
    }
  }
})

export function usePermissionStoreHook() {
  return usePermissionStore(store)
}
